package com.itheima.edu.info.manager.controller;

import com.itheima.edu.info.manager.domain.Student;
import com.itheima.edu.info.manager.service.StudentService;

import java.util.Scanner;

/**
 * @author Xiao
 * @date 2021/7/17
 */
public abstract class StudentController_Base {
    //创建StudentService对象，以便访问StudentService中的成员
    private StudentService stus = new StudentService();
    private Scanner sc = new Scanner(System.in);

    public void entry() {
        while (true) {
            System.out.println("--------欢迎使用黑马<学生>管理系统--------");
            System.out.println("1.添加学生\t2.删除学生\t3.修改学生\t4.查询学生\t5.退出");
            System.out.println("请输入您的选择：");
            String choice = sc.next();
            switch (choice) {
                case "1":
//                    System.out.println("添加学生");
                    addStudent();
                    break;
                case "2":
//                    System.out.println("删除学生");
                    deleteStudent();
                    break;
                case "3":
//                    System.out.println("修改学生");
                    updateStudent();
                    break;
                case "4":
//                    System.out.println("查询学生");
                    findAllStudent();
                    break;
                case "5":
                    System.out.println("感谢您的使用。");
                    return;
                default:
                    System.out.println("您输入的选项有误。");
                    break;
            }
        }
    }

    //这是一个修改方法，键盘录入要修改的学生学号，根据学号修改对应学生信息
    public final void updateStudent() {
        //判断学生数组中是否有学生对象存在，如果不存在学生对象，给出提示
        Student[] stuArr = stus.findAllStudent();
        if (stuArr == null) {
            System.out.println("暂无学生信息，请先添加。");
            return;
        }
        String sid = inputSid();
        System.out.println("当前要修改的学生信息如下：");
        System.out.println("学号\t\t姓名\t年龄\t生日");
        for (Student stu : stuArr) {
            if (sid.equals(stu.getId())) {
                System.out.println(stu.getId() + "\t" + stu.getName() + "\t" + stu.getAge() + "\t\t" + stu.getBirthday());
                //键入要修改的学生信息
                stu = inputStuInfo(sid);
                //将修改后的学生对象传递给StudentService中的updateStudent(Student stu)方法进行修改
                stus.updateStudent(sid, stu);
                break;
            }
        }
        System.out.println("修改成功！");
    }

    //这是一个删除方法，键盘录入要删除的学生学号，根据学号删除对应学生对象
    public final void deleteStudent() {
        //判断学生数组中是否有学生对象存在，如果不存在学生对象，给出提示
        Student[] stuArr = stus.findAllStudent();
        if (stuArr == null) {
            System.out.println("暂无学生信息，请先添加。");
            return;
        }
        String sid = inputSid();
        stus.deleteStudent(sid);
        System.out.println("删除成功！");
    }


    //这是一个查询方法，需要从学生集合中取出所有学生对象，并将学生对象的信息打印在控制台
    public final void findAllStudent() {
        //访问StudentService中的findAllStudent()方法，获取学生数组
        Student[] stuArr = stus.findAllStudent();
        //判断学生数组是否含有学生对象，如果有，遍历学生数组并打印学生信息
        if (stuArr != null) {
            System.out.println("学号\t\t姓名\t年龄\t生日");
            //遍历学生数组（迭代器方式），获取学生信息并打印到控制台
            for (Student stu : stuArr) {
                //判断数组元素是否为null，只能打印数组中元素不是nul的学生对象信息，
                // 否则会报错：NullPointerException
                if (stu != null) {
                    System.out.println(stu.getId() + "\t" + stu.getName() + "\t" + stu.getAge() + "\t\t" + stu.getBirthday());
                }
            }
            return;
        }
        System.out.println("当前暂无学生信息，请添加后查询。");
    }

    //这是一个添加方法，需要将学生信息封装成学生对象，将学生对象添加到学生数组
    public final void addStudent() {
        //这个方法中需要多次访问StudentService类，同时需要封装学生信息，需要对学号进行判断
        // 因此将以下对象/变量的创建放至首行，确保能够作用于本方法的全部成员。
        String sid;     //作用域 → 所在大括号范围

        //封装学生信息：学号、姓名、年龄、生日
        while (true) {
            System.out.println("请输入学生学号：");
            sid = sc.next();
            //StudentService中的isExists(String sid)方法，返回一个判断结果：学号是否存在
            boolean flag = stus.isExists(sid);
            if (flag) {
                System.out.println("您输入的学号已存在。");
                continue;
            }
            break;
        }
        Student stu = inputStuInfo(sid);
        //StudentService中的addStudent方法：返回一个判断结果：学生对象存入学生数组是否成功
        boolean flag = stus.addStudent(stu);
        if (flag) {
            System.out.println("添加成功！");
            return;
        }
        System.out.println("添加失败。");
    }

    //这是一个键入学生信息并封装为学生对象的方法。
    public abstract Student inputStuInfo(String sid);

    //这是一个录入学生id并判断id是否存在的方法
    public final String inputSid() {
        while (true) {
            System.out.println("请输入您要修改的学生学号：");
            String sid = sc.next();
            boolean flag = stus.isExists(sid);
            if (!flag) {
                System.out.println("您输入的学号不存在。");
                continue;
            }
            return sid;
        }
    }

}
